﻿#ifndef _HTTPS_SERVICE_H_

#ifdef _WIN32
// windows.h 中包含winsock2.h, 添加该宏可以避免重复包含winsock2.h
#define WIN32_LEAN_AND_MEAN
#include <mutex>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <thread>
#include <windows.h>
#else
// TODO: 添加对Linux的支持
#endif

using namespace std;

namespace nets {
    typedef struct {
        int         host;
        int         port;
        int         is_ssl;
        const char *cert_file;
        const char *key_file;
    } server_conf;

    class HttpsService {
    public:
        void init();

        SSL_CTX *create_context();

        void configure_context(SSL_CTX *ctx);

        int *worker();

        int run(const server_conf *);

        int free(SSL &ssl, SOCKET s);

    private:
        // 条件变量用于线程间同步
        condition_variable cv;

        //
        // 互斥锁用于保护共享资源
        //
        mutex mtx;

        // 客户端套接字队列
        // 这里使用的是整数类型，实际应用中可能需要使用更复杂的类型来处理套接字
        queue<SSL *> clients;

        server_conf *sv_conf;

        int SSL_CTX_use_PrivateKey_file_pass(SSL_CTX *ctx, char *filename, char *pass);
        int verify_callback(int preverify_ok, X509_STORE_CTX *ctx);
    };
#endif // !_HTTPS_SERVICE_H_
}